home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Speccy ClassiX 1998
/
Speccy ClassiX 98.iso
/
amiga_system
/
the_aminet
/
comm
/
bbs
/
bbbbs85.lha
/
rexx
/
bbsDoors.rexx
< prev
next >
Wrap
OS/2 REXX Batch file
|
1995-02-20
|
9KB
|
419 lines
/* $VER: bbsDoors.rexx 8.5 (20.2.95)
copyright 1993-95 Richard Lee Stockton
FREELY DISTRIBUTABLE
Thanks to Matt English for "Jump.rexx"
*/
IF ~SHOW('P','QuickSortPort') THEN CALL setup.rexx()
IF ~SHOW('P','QuickSortPort') THEN EXIT 666
SIGNAL ON BREAK_C
SIGNAL ON FAILURE
SIGNAL ON SYNTAX
OPTIONS FAILAT 999999
CALL TIME('R')
ARG maxtime name pw
IF ~DATATYPE(maxtime,'N') THEN maxtime=6000
namemask=COMPRESS(XRANGE(),XRANGE('A','Z')' _-')
IF ADDRESS()='BAUD' THEN
DO
frombb=1
CR='0D'x
END
ELSE
DO
frombb=0
CR=''
END
figarg='s:CONFIG.BBS'
IF ~EXISTS(figarg) THEN figarg='BBS:BBS_TEXT/CONFIG.BBS'
x=OPEN(f,figarg,'R')
IF x=0 THEN
DO
SAY 's:CONFIG.BBS and BBS:BBS/CONFIG.BBS are both missing!'CR
EXIT(20)
END
lynes.=''
DO i=1 TO 6
lynes.i=READLN(f)
END
CALL CLOSE(f)
compos=POS('/*',lynes.1)
IF compos>0 THEN lynes.1=LEFT(lynes.1,compos-1)
bbsname=STRIP(lynes.1)
sysop =WORD(lynes.2,1)
bbspath=WORD(lynes.6,1)
IF ~EXISTS(bbspath) THEN
DO
SAY bbspath 'does not exist!'CR
CALL SETCLIP('BBS_STAT')
EXIT(20)
END
testchar=RIGHT(bbspath,1)
IF testchar~='/' & testchar~=':' THEN bbspath=bbspath'/'
IF GETCLIP('BBS_path')='' THEN CALL SETCLIP('BBS_path',bbspath)
CALL PRAGMA('D',bbspath'rexxDoors')
IF ARG()=0 THEN
DO
SAY
SAY ' bbsDoors.rexx'
SAY ' Original by Matt English 9-30-92'
SAY ' Alterations by RLS through 11-25-94'
SAY
END
IF name='' THEN
DO
SAY
SAY
options prompt' Are you 'sysop' ? Y or n > '
pull answer
if answer='Y' | answer='' then name=sysop
else DO
SAY
options prompt' Please enter your name > '
pull name
name=strip(name)
name=translate(name,'_',' ')
if name='' then CALL bye
END
SAY
END
file=bbspath'Users/'name
IF ~EXISTS(file) THEN
DO
SAY CR
SAY 'I can''t find' name 'on the users list!'CR
SAY 'You should log on to the BBS before you try this!'CR
CALL delay(100)
CALL bye
END
colorflag=0
userfile=bbspath'Users/'name
CALL OPEN(data,userfile,'r')
DO i=1 TO 20
line=readln(data)
IF i=5 THEN password=line
IF i=8 THEN
IF FIND(line,'COLOR')>0 THEN colorflag=1
IF i=18 THEN winnings=WORD(line,1)
IF i=20 THEN level=WORD(line,1)
END
CALL close(data)
IF ~DATATYPE(winnings,'N') THEN winnings=0
def='';bak2='
';pen3='
'
IF colorflag=0 THEN
DO
def='';bak2='';pen3=''
END
IF pw~=password THEN
DO
passprompt=' 'pen3'Please Enter Password:
'
DO tries=1 TO 3
OPTIONS PROMPT passprompt
PULL newpassword
SAY ''CR
IF(password=newpassword) THEN LEAVE tries; /* correct password */
IF tries=3 THEN
DO
SAY CR
SAY 'Access terminated.'CR
SAY '*** Bad password ***' newpassword '***'CR
CALL bye
END
passprompt='Incorrect. Password: '
END
SAY CR
SAY' OK, 'name' here we go....'CR
SAY CR
END
CALL sortdoors()
temp=1
played=0
DO doorloop=1
IF temp=0 THEN
DO
IF played THEN
DO
doors.0=''
CALL sortdoors()
END
SAY CR
SAY CENTER('- Number of accesses per file -',75)||CR
END
CALL showtime()
SAY pen3||LEFT('-',75,'-')||def||CR
DO jd=1 TO jdoors.0
IF temp=0 THEN SAY jdoors.jd.0||CR
ELSE SAY jdoors.jd||CR
END
SAY pen3||LEFT('-',75,'-')||def||CR
IF temp=0 THEN
DO
OPTIONS PROMPT ' 'pen3'Press RETURN 'def
PULL junk
temp=1
SAY CR
ITERATE doorloop
END
arg='Menu'
CALL postuser()
temp=getinput(1 0 pen3'Select Application Number. 0=Stats > 'def)
IF temp=0 THEN ITERATE doorloop
IF ~DATATYPE(temp,'N') | temp<1 | temp>doors.0 THEN CALL bye
arg=doors.temp
IF GETCLIP('BBS_door')=arg | GETCLIP('BBS_localdoor')=arg THEN
DO
SAY 'That door is in use! Try again in a few minutes...'CR
ITERATE doorloop
END
played=1
IF frombb THEN CALL SETCLIP('BBS_door',arg)
ELSE CALL SETCLIP('BBS_localdoor',arg)
CALL Increment.rexx(bbspath'rexxDoors/'arg)
savewinnings=0
testwin=''
IF frombb THEN
DO
CALL send2log(arg 'at' TIME('C'))
CALL SETCLIP('BBS_winnings')
timeleft=TRUNC(maxtime-TIME('E'))
IF UPPER(arg)='ONE_ARMED_BANDIT.REXX' THEN
IF getinput(1 1 'Play for this sessions time in seconds? (Ny) > ')='Y' THEN
DO
savewinnings=winnings
IF savewinnings=0 THEN savewinnings=1
winnings=timeleft
SAY 'Playing for REAL seconds, not wimpy play-dollars!'CR
END
CALL postuser()
END
ELSE CALL TIME('R')
comm='CALL' arg'('TRANSLATE(name,'_','-') winnings savewinnings colorflag maxtime-TIME('E')-42')'
INTERPRET comm
IF frombb THEN
DO
testwin=GETCLIP('BBS_winnings')
IF DATATYPE(testwin,'N') THEN
DO
IF savewinnings>0 THEN
DO
IF testwin>7200 THEN
DO
SAY 'Although you won' TRUNC(testwin/60) 'minutes, the maximum session time is 120 minutes.'CR
testwin=7200
END
maxtime=TRUNC(testwin+TIME('E'))
CALL SETCLIP('BBS_maxtime',maxtime)
winnings=savewinnings
END
ELSE
DO
winnings=testwin
CALL SETCLIP('BBS_winnings',winnings)
END
END
CALL SETCLIP('BBS_door')
END
ELSE CALL SETCLIP('BBS_localdoor')
END
sortdoors:
IF ~DATATYPE(jdoors.0,'W') THEN doors.0=0
IF WORDS(SHOWDIR(bbspath'rexxDoors','F'))~=doors.0 THEN
DO
played=0
jdoors.=''
doorlist=SHOWDIR(bbspath'rexxDoors','F')
doors.=''
doors.0=WORDS(doorlist)
DO i=1 TO doors.0
doors.i=WORD(doorlist,i)
END
CALL QSORT(1,doors.0,doors)
jdoors.0=doors.0%3
IF (doors.0//3)>0 THEN jdoors.0=jdoors.0+1
DO i=1 TO jdoors.0
DO j=0 TO 2
k=i+j*jdoors.0
IF k<=doors.0 THEN
DO
jdoors.i=jdoors.i' 'LEFT(RIGHT(k,3)'.' LEFT(doors.k,LENGTH(doors.k)-5),24)
dcount=WORD(STATEF(bbspath'rexxDoors/'doors.k),8)
jdoors.i.0=jdoors.i.0||LEFT(RIGHT(dcount,5) LEFT(doors.k,LENGTH(doors.k)-5),24)' '
END
END
END
END
RETURN 0
send2log:
PARSE ARG sendline
IF ~frombb THEN RETURN
logfile=bbspath'Logs/log.'DATE('S') /* daily logs */
fl='W'
IF EXISTS(logfile) THEN fl='A'
IF ~OPEN('log',logfile,fl) THEN
DO
IF ~OPEN('log',logfile,fl) THEN
DO
SAY 'failed to open log file'CR
RETURN
END
END
CALL WRITELN('log','bbsDoors:' sendline)
CALL CLOSE('log')
RETURN
getinput:
PARSE ARG upflag' 'oneflag' 'pline
CALL checkdcd()
OPTIONS PROMPT pline
PARSE PULL inarg
inarg=STRIP(inarg)
IF upflag THEN inarg=UPPER(inarg)
IF oneflag THEN inarg=LEFT(inarg,1)
inarg=cleanstring(0':'inarg)
CALL checktime()
RETURN inarg
showtime:
IF ~frombb THEN RETURN
mins=TIME('E')%60
secs=TRUNC(TIME('E')//60)+1
IF secs>59 THEN secs=59
IF secs<10 THEN secs='0'secs
line=' Time: Used' mins':'secs
mins=(maxtime-TIME('E'))%60
secs=TRUNC((maxtime-TIME('E'))//60)
IF secs<10 THEN secs='0'secs
line=line' Remaining' mins':'secs
SAY def||line||CR
checktime:
IF ~frombb THEN RETURN
IF TIME('E')>maxtime THEN EXIT 0
IF TIME('E')>(maxtime-120) THEN SAY '*** Less than 2 minutes left! ***'CR
MSG RIGHT(' ',66-LENGTH(name)) '1B'x'M'||'
'||'
'||' 'name' level 'level' '||'
'
CALL checkdcd()
RETURN
waiting:
CALL checktime()
IF waitchar='Q' THEN
DO
waitchar=''
RETURN
END
waitchar=''
IF nonstop=1 THEN RETURN
OPTIONS PROMPT pen3' RETURN=Continue 'def
PULL waitchar
CALL checkdcd()
RETURN
checkdcd:
IF ~frombb THEN RETURN
dcd
IF RC=0 THEN
DO
DO dcds=1 TO 3 /* 5 second delay */
CALL DELAY(50)
dcd
IF RC~=0 THEN RETURN
END
dcd
IF RC=0 THEN EXIT
END
xmsg=GETCLIP('BBS_MESSAGE')
IF xmsg~='' THEN
DO
CALL SETCLIP('BBS_MESSAGE')
SAY CR
SAY bak2' Message From BBBBS: 'def||CR
SAY xmsg||CR
SAY CR
CALL waiting()
END
IF POS('G',GETCLIP('BBS_COMMAND'))>0 THEN EXIT
RETURN
strip_ansi:
PARSE ARG aline
n=POS('1B'x,aline)
DO WHILE n>0
DO k=2
IF DATATYPE(SUBSTR(aline,n+k,1),'M') | (n+k+1)>LENGTH(aline) THEN
leave k
END
aline=DELSTR(aline,n,k+1)
n=POS('1B'x,aline)
END
RETURN aline
cleanstring:
PARSE ARG nflag':'cstr
IF nflag=1 THEN
DO
cstr=COMPRESS(cstr,"'`")
cstr=TRANSLATE(cstr,,namemask)
cstr=SPACE(cstr,1,'_')
RETURN cstr
END
bot=XRANGE(,'1F'x)
IF nflag=2 THEN bot=COMPRESS(bot,'1B'x) /* ESC for ANSI */
ELSE cstr=strip_ansi(cstr)
top=XRANGE('7F'x)
cstr=COMPRESS(cstr,bot||top)
IF nflag=0 THEN cstr=STRIP(cstr)
RETURN cstr
postuser:
IF ~frombb | ~SHOW('P','BBSPOST') THEN RETURN
ptext=GETCLIP('BBSPOST4')
IF WORDS(ptext)>4 THEN ptext=LEFT(ptext,WORDINDEX(ptext,5)-1)
ptext=STRIP(ptext)
ptext=CENTER(ptext' Door:' arg,74)
CALL SETCLIP('BBSPOST4',ptext)
ADDRESS BBSPOST 'UPDATE'
RETURN
bye:
BREAK_C:
IF frombb THEN CALL SETCLIP('BBS_door')
ELSE CALL SETCLIP('BBS_localdoor')
SAY CR
EXIT
FAILURE:
SYNTAX:
lin.1='
'ERRORTEXT(RC)'
'
lin.2=SIGL-1 SOURCELINE(SIGL-1)
lin.3=SIGL '
'SOURCELINE(SIGL)'
'
lin.4=SIGL+1 SOURCELINE(SIGL+1)
DO er=1 TO 4
IF level>sysoplevel | ~frombb THEN SAY 'bbsDoors:' lin.er||CR
IF frombb THEN CALL send2log(lin.er)
END
EXIT
/* bbsDoors.rexx */